package main

import "fmt"

func lengthOfNonRepeatingSubString(s string) int {

	lastOccurred := make(map[byte]int)
	start := 0
	maxLength := 0

	// 将 string s 转换为 []byte 切片
	// i 当前索引
	// ch 当前字符
	for i, ch := range []byte(s) {

		// lastI 字符最后出现的 索引 位置
		// ok map 中 是否包含 该 字符 与 字符对应的 索引
		// lastOccurred[ch] 可能不存在 ，并且默认值为 0 ，需要排除这种情况
		if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
			// 字符最后出现的 索引 位置 >=  起始位置 ， 说明这段字符串已经重复了
			start = lastOccurred[ch] + 1
		}

		// i - start 走过的“长度”
		// +1 因为索引从 0 开始的
		if i-start+1 > maxLength {
			maxLength = i - start + 1
		}

		lastOccurred[ch] = i
	}

	return maxLength
}

func main() {
	fmt.Println(lengthOfNonRepeatingSubString("abcabcdefghijklmnopq"))
	fmt.Println(lengthOfNonRepeatingSubString("abcabcddd"))
	fmt.Println(lengthOfNonRepeatingSubString("abcabcdddced"))
	fmt.Println(lengthOfNonRepeatingSubString("abcabcdded"))
}
